﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CRUD.InterfaceDAO;
using CapaNegocios;
using GestionadorBaseDatos;
using CapaGestion.Spring;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;


namespace CapaGestion
{
    /// <summary>
    /// Gestiona las reglas de negocio para los usuarios
    /// </summary>
    public class GestionarUsuario : IGestionUsuario
    {
        private IDaoUsuario daoUsuario;
        private IDaoMantenimientoUsuario daoMantenimientoUsuario;
        private IDaoPago daoPago;
        private IDaoFormaPago daoFormaPago;
        private IGestionApuesta gestionarApuesta = AdministradorGestion.getGestionarApuesta();

        /// <summary>
        /// Metodo que permite obtener todos los usuarios.
        /// </summary>
        /// <returns>
        /// Retorna una coleccion de de tipo List que contiene objetos de tipo Usuario.
        /// </returns>
        public List<Usuario> ObtenerUsuarios()
        {
            IList usuarios = daoUsuario.GetAll();

            List<Usuario> lista = new List<Usuario>();

            foreach (Usuario usuario in usuarios)
            {
                usuario.PagosAsociados = daoPago.GetPagosByUsuario(usuario);
                lista.Add(usuario);
            }
            return lista;
        }

        /// <summary>
        /// Metodo que permite actualizar los datos de un usuario. 
        /// </summary>
        /// <param name="usuario">
        /// Recibe como parametro un objeto de tipo Usuario;
        /// </param>
        public void ActualizarDatosUsuario(Usuario usuario)
        {
            daoUsuario.Update(usuario);
        }
        /// <summary>
        /// Metodo que permite insertar o registrar un nuevo usuario.
        /// </summary>
        /// <param name="usuario">
        /// Recibe como parametro un objeto de tipo Usuario
        /// </param>
        public void RegistrarUsuario(Usuario usuario)
        {
            daoUsuario.Insert(usuario);
        }

        /// <summary>
        /// Metodo que permite obtener a un usuario dado su nickname.
        /// </summary>
        /// <param name="nickname">
        /// Recibe como parametro un tipo de dato string que reprensenta el nickname del usuario;
        /// </param>
        /// <returns>
        /// Retorna un objeto de tipo Usuario.
        /// </returns>
        public Usuario ObtenerUsuarioPorNickname(string nickname)
        {
            Usuario usuario = daoUsuario.GetByNickname(nickname);
            usuario.PagosAsociados = daoPago.GetPagosByUsuario(usuario);
            foreach (Pago p in usuario.PagosAsociados)
            {
                p.FormaPagoAsociado = daoFormaPago.GetById(p.FormaPagoAsociado);
            }
            usuario.MantenimientosUsuario = daoMantenimientoUsuario.GetMantenimientosUsuarioByUsuario(usuario);
            return usuario;
        }

        /// <summary>
        /// Metodo que permite obtener un usuario teniendo su nickname y su password. Este metodo se usa exclusivamente
        /// para la zona de login de un usuario. 
        /// </summary>
        /// <param name="usuario">
        /// Recibe como parametro un objeto de tipo Usuario el cual tiene llenos los atributos de nickname y password.
        /// </param>
        /// <returns>
        /// Retorna un objeto de tipo Usuario.
        /// </returns>
        public Usuario ObtenerUsuario(Usuario usuario)
        {
            IList usuarioEncontrar = daoUsuario.GetByPasswordAndUser(usuario.Nickname, usuario.Password);

            if (usuarioEncontrar.Count != 0)
            {
                ((Usuario)usuarioEncontrar[0]).PagosAsociados = daoPago.GetPagosByUsuario(((Usuario)usuarioEncontrar[0]));
                ((Usuario)usuarioEncontrar[0]).MantenimientosUsuario = daoMantenimientoUsuario.GetMantenimientosUsuarioByUsuario(((Usuario)usuarioEncontrar[0]));
                return (Usuario)usuarioEncontrar[0];
            }
            else
            {
                return usuario;
            }

        }



        /// <summary>
        /// Gestiona el envio de correo luego de realizar el registro de usuario
        /// </summary>
        public void EnviarCorreoBienvenida(Usuario usuario)
        {
            System.Net.Mail.MailMessage correo = new System.Net.Mail.MailMessage();

            correo.From = new System.Net.Mail.MailAddress("kamalde.services@gmail.com", "Kamalde", System.Text.Encoding.UTF8);
            correo.To.Add(usuario.CorreoElectronico);
            correo.Subject = "Registro de Usuario en Kamalde";
            correo.SubjectEncoding = System.Text.Encoding.ASCII;


           correo.Body = "Gracias por registrarse en Kamalde, se le notifica por el presente correo \n\r" +
                       "que para que el Estatus de su cuenta sea modificado a Activo debe ir al siguiente vinculo: \n\r" +
                       "<a href=http://localhost/InterfazKamalde/InterfazKamalde/ActivarCuenta.aspx?Nickname=" + usuario.Nickname + ">Activar Cuenta</a>" + "\n\r" +
                       " para mas informacion contactenos a Kamalde.Services@gmail.com \n\r" +
                       "Fecha y Hora: " + DateTime.Now; ;


            correo.SubjectEncoding = System.Text.Encoding.Default;
            correo.IsBodyHtml = true;
            correo.Priority = System.Net.Mail.MailPriority.Normal;

            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();

            smtp.Host = "smtp.gmail.com";
            smtp.Port = 587;
            smtp.Credentials = new System.Net.NetworkCredential("kamalde.services@gmail.com", "barroeta");
            smtp.EnableSsl = true;

            try
            {
                smtp.Send(correo);
            }
            catch (Exception ex)
            {
                //ex.Message;
            }
        }


        /// <summary>
        /// Procedimiento para enviar correo una vez el usuario haya sido dado de baja
        /// </summary>
        /// <param name="usuario">Datos del usuario afectado</param>
        public void EnviarCorreoSituacion(Usuario usuario)
        {
            System.Net.Mail.MailMessage correo = new System.Net.Mail.MailMessage();

            correo.From = new System.Net.Mail.MailAddress("kamalde.services@gmail.com", "Kamalde", System.Text.Encoding.UTF8);
            correo.To.Add(usuario.CorreoElectronico);
            correo.Subject = "Situacion en Kamalde";
            correo.SubjectEncoding = System.Text.Encoding.ASCII;


            correo.Body = "El Staff operativo de Kamalde ha tomado la decisión de darlo de baja Sr/Sra " + usuario.Nombre + " " + usuario.Apellido + "\n\r"+
                        " podra seguir entrando a la página pero no disfrutar de nuestros servicios de apuestas  \n\r" +
                        " para mas informacion contactenos a Kamalde.Services@gmail.com \n\r" +
                        "Fecha y Hora: " + DateTime.Now ; ;

            correo.SubjectEncoding = System.Text.Encoding.Default;
            correo.IsBodyHtml = true;
            correo.Priority = System.Net.Mail.MailPriority.Normal;

            System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();

            smtp.Host = "smtp.gmail.com";
            smtp.Port = 587;
            smtp.Credentials = new System.Net.NetworkCredential("kamalde.services@gmail.com", "barroeta");
            smtp.EnableSsl = true;

            try
            {
                smtp.Send(correo);
            }
            catch (Exception ex)
            {
                //ex.Message;
            }
        }



        #region Miembros de IGestionUsuario

        #endregion
    }
}
